package com.carrotsearch.hppc;
import static com.carrotsearch.hppc.HashContainers.*;
import java.util.HashSet;
import org.assertj.core.api.Assertions;
import org.junit.Test;
import com.carrotsearch.randomizedtesting.RandomizedTest;
public class HashContainersTest extends RandomizedTest {
/* */
@Test
public void testCapacityCalculations() {
assertEquals(MIN_HASH_ARRAY_LENGTH, minBufferSize(0, 0.5f));
assertEquals(MIN_HASH_ARRAY_LENGTH, minBufferSize(1, 0.5f));
assertEquals(0x20, minBufferSize(0x10, 0.5f));
assertEquals(0x40, minBufferSize(0x10, 0.49f));
int maxCapacity = maxElements(HashContainers.MAX_LOAD_FACTOR);
assertEquals(0x40000000, minBufferSize(maxCapacity, MAX_LOAD_FACTOR));
// This would fill the array fully, validating the invariant, but should
// be possible without reallocating the buffer.
minBufferSize(maxCapacity + 1, MAX_LOAD_FACTOR);
assertEquals(maxCapacity + 1, expandAtCount(MAX_HASH_ARRAY_LENGTH, MAX_LOAD_FACTOR));
try {
// This should be impossible because it'd create a negative-sized array.
minBufferSize(maxCapacity + 2, MAX_LOAD_FACTOR);
fail();
} catch (BufferAllocationException e) {
// Expected.
}
}
/* */
@Test
public void testLoadFactorOne() {
assertEquals(0x100, minBufferSize(0x80, 1d));
assertEquals(0x7f, expandAtCount(0x80, 1d));
assertEquals(0xff, expandAtCount(0x100, 1d));
}
@Test
public void testAddReplacements()
{
ObjectHashSet<Integer> set = new ObjectHashSet<>();
HashSet<Integer> reference = new HashSet<>();
Integer i1 = 1;
Integer i2 = new Integer(i1.intValue());
assertTrue(set.add(i1));
assertTrue(reference.add(i1));
assertFalse(set.add(i2));
assertFalse(reference.add(i2));
Assertions.assertThat(reference.iterator().next()).isSameAs(i1);
Assertions.assertThat(set.iterator().next().value).isSameAs(i1);
}
}